home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / msdos / raytrace / pov / gen / form04a / docs / tutor.doc < prev    next >
Text File  |  1994-02-03  |  22KB  |  681 lines

  1. TUTOR.DOC
  2.  
  3. REGISTRATION. 
  4.  
  5.     This program is FREE, you don't have to register. I would like
  6. some feedback though, you could consider this some sort of
  7. registration if you like. For more info see readme.1st and form.doc.
  8.  
  9.  
  10. HOW TO RUN IT 
  11.  
  12.     In it's simplest invocation you can just type "FORM". Don't do
  13. that yet, you would normally supply a filename, try "FORM
  14. SAMPLE1.FRM". Usually form files have a .frm extension and this is
  15. assumed of you do not supply it. 
  16.  
  17.     This should display a sort of staircase in grey on your monitor
  18. with the message "Press any key to continue" splatted all over the
  19. top line. You can abort displaying by pressing <ESC>.
  20.  
  21.     Press a key, the form program should return your text screen, and
  22. display :-
  23.  
  24. Zbuffer used DOS Memory
  25. Display took 19.67 secs at resolution 320x200
  26. // sample file
  27. a_spine=box <0.2 , 0.5 , 0.2 > stack 10 in 50% grow 0.2 twist 90;
  28. tweeny_bit = sphere 0.3 stack 1;
  29. tweeny_bit, [a_spine] stack 30 in 75% twist 360;
  30. end;
  31. Zbuffer used DOS Memory
  32.  
  33.     The first and last lines of this output are really debug messages.
  34.  
  35.     The second line is self explanatory, the rest of the lines are
  36. the contents of sample1.frm, FORM always displays the text that
  37. produced the form just displayed. It also puts this text into a file
  38. temp.frm, and also at the beginning of any pov file it outputs. Well
  39. you wouldn't want to accidently lose your form would you?  We should
  40. now be able to configure the program so it runs faster and produces a
  41. better quality display.
  42.  
  43.  
  44. CONFIGURING
  45.  
  46. 1. DIRECT SCREEN ACCESS
  47.  
  48.     The default configuration uses the BIOS to perform its display
  49. function, this is extremely slow and limited. So to improve the
  50. display speed you can turn off the "compatibility mode" with the
  51. -bios- command line switch. 
  52.  
  53.     WARNING: As with all screen mechanisms that bypass BIOS there may
  54. be some danger of damage to your monitor, this is very unlikely but
  55. if you are unhappy do not use this command line switch. 
  56.  
  57.     Try running "FORM -bios- sample1" this should have displayed
  58. quite a bit faster. If you saw nothing or something strange then it
  59. looks as if you may (I only say may) be unable to use the faster access, 
  60. or higher resolution modes. All is not yet lost, you can try "FORM -bios-
  61. -modex sample1", this uses an alternative (more standard) method of
  62. accessing the VGA screen that is still much faster than BIOS, but
  63. doesn't use the SVGAKIT drivers.
  64.  
  65.     If "-bios-" or "-bios- -modex" worked then you can edit the line
  66. "bios=no" to "bios=yes" in sstools.ini, and also, optionally, insert the
  67. line "ModeX=yes" set (or set an environment variable "FORM=-bios- -modex")
  68.  
  69. 2. SUPERVGA MODES
  70.  
  71.     Now we will try higher resolution modes. This will probably only
  72. work if you have a "Super VGA" card.
  73.  
  74.     Try "FORM -res2 sample1" you should see the same picture but the
  75. edges should be smoother. When you press a key the screen resolution
  76. used will be displayed. This may still be 320x200 if FORM couldn't
  77. find a higher resolution mode for your card. 
  78.  
  79.     If that worked try "FORM -res3 sample1" (you're probably getting
  80. bored of sample1 by now). Again you should see the same picture but
  81. the edges should be smoother still. When you press a key the screen
  82. resolution used will be displayed, and the time taken.
  83.  
  84.     If -res2 didn't work, then I'm afraid you're stuck with plain old
  85. 320x200.  If -res3 didn't work, then I'm afraid you're stuck with
  86. res2.
  87.  
  88.  
  89. Res2 tries modes 640x350, 640x400, and 640x480
  90. Res3 tries all res1 and res2 modes and 800x600, 1024x768 and 1280x1024
  91.  
  92.     You may find that your system supports a higher resolution than
  93. FORM will use, this is probably because FORM couldn't find enough
  94. extended or expanded memory for it's workspace, it will use the 
  95. highest resolution that it can. (see the -disk+ switch)
  96.  
  97.  
  98.     To set a resolution as "permanent" edit the sstools.ini file
  99. "screen_res=" line. Don't necessarily pick screen_res=3 as the time
  100. taken to display at the higher resolutions can be annoyingly long. I
  101. use res1 normally, res2 on a 486 (cos they're blindingly fast) and
  102. either res2 or res3 when I'm saving the screen to a file (more about
  103. saving screens in a bit).
  104.  
  105.  
  106. Saving the screen 
  107.  
  108.     If you add the command line "-save" the screen will be saved to a
  109. file called TEMP.GIF, you can override the output type and save as a
  110. TGA file with the -t option, you can also override the output
  111. filename if you use -save=filename, (.GIF ot .TGA will be added as
  112. appropriate). 
  113.  
  114.  
  115. TUTORIAL
  116.  
  117. Creating your own forms
  118. =======================
  119.  
  120.     If you do not give FORM a file to process it will accept input
  121. from the keyboard, this is only useful when you are playing around, a
  122. much better method would be to use an editor to edit your form, and a
  123. batch file like FORMED.BAT, which you would run with a filename to
  124. edit. 
  125.  
  126.     FORMED is a simple batch file that runs in an edit/display loop,
  127. so it allows you to progressively change your form. It is also useful
  128. for getting rid of errors, and is probably worth using throughout
  129. this tutorial.  To run try "FORMED TEST.FRM", your editor (taken from
  130. an environment variable "edit" or the batch file edit.bat) will run
  131. up with TEST.FRM as the input file. When you leave your editor FORM
  132. will be run with an input file of TEST.FRM.
  133.  
  134.     In this tutorial we will assume you are using FORMED.
  135.  
  136.     Run FORM you will see some text like:
  137.  
  138.             Copyright message
  139.             Form: 
  140.                 $Revision: 1.8 $ $Date: 94/02/03 12:53:37 $
  141.  
  142.  
  143.     This is pretty much useless information and is there mainly for
  144. my purposes.
  145.  
  146. SIMPLE FORM SCRIPT
  147.  
  148. Start up FORMED and enter exactly (FORM is case-sensitive)
  149.  
  150.             sphere; 
  151.             end;
  152.  
  153. Quit your editor and FORM will display a single sphere in the middle
  154. of the screen.
  155.  
  156. This is a simple Form script. 
  157.  
  158.     All form descriptions end with the word "end;" This tells FORM
  159. where the end of the input is. FORM will then produce any required
  160. output. If the description just ended without the word "end" no
  161. output would be generated.
  162.  
  163.     What you instructed FORM to do was to create a form consisting of
  164. a single sphere. Note the semi-colon, this told FORM that the object
  165. had finished and not to try and interpret the next word as part of
  166. the same object. 
  167.  
  168.     Form is blind to spaces, as long as there is at least one space,
  169. tab or newline FORM doesn't care.
  170.  
  171.     Form also accepts comments (only really useful in files), these
  172. look like "/* comment here */" or "// comment until the end of the
  173. line"
  174.  
  175. COPYRIGHT   
  176.  
  177.     You can now place a copyright message in you form script, and
  178. have it displayed on the screen when it is encountered.
  179.  
  180. ERRORS
  181.  
  182. FORM does not come with much error checking, what there is comes in
  183. two flavours.
  184.  
  185. 1. SYNTAX ERRORS 
  186.  
  187.     If you entered somthing wrong FORM will print out something like:
  188. "error on line 2 near:" and then print out the script upto the point
  189. where it failed. The error is usually a missing semi-colon from the
  190. previous word, or a spelling mistake.
  191.  
  192. 2. Program errors.
  193.  
  194.     As I said FORM does very little error checking, so it can (and
  195. WILL) allow you to enter something that doesn't really make sense to
  196. it (after all it's only a dumb computer). In these cases you will
  197. probably get a beep and a message along the lines of "FPE SIGNAL".
  198. FORM may even return to DOS. All that I can say about your error is
  199. that it probably consisted of one of "bend, twist, or grow" without a
  200. preceeding "stack" ot "list". This explanation will make a little
  201. more sense later. 
  202.  
  203.  
  204. JOINING
  205.  
  206. Run FORM again, this time enter
  207.  
  208.         sphere, box;
  209.         end;
  210.  
  211.     You got a sphere and a box stacked on top of each other, in FORM
  212. when two objects are separated by a "," they are "joined" end to end. 
  213.  
  214.  
  215. STACKING
  216.  
  217. Try     sphere stack 5;
  218.         end;
  219.  
  220.     This time you get 5 spheres "stacked" on top of each other.
  221. Stacking is not quite the same as joining, but it is similar. 
  222.  
  223. Try     sphere, box stack 5;
  224.         end;
  225.  
  226.     You get three spheres and two boxes because you asked to stack
  227. them 5 high. The stack works on the sphere, box in order so you get:
  228.  
  229.     sphere
  230.     box
  231.     sphere
  232.     box
  233.     sphere
  234.  
  235.  
  236. NUMBERS 
  237.  
  238.     Now is a good time to make some points about numbers, in FORM
  239. scripts all numbers are floating point, that means that 1.5 is a valid
  240. number anywhere that 1 is valid. BUT if FORM only expects an integer
  241. then the number will be truncated to 1. (e.g. for stack)
  242.  
  243.     All angles are in degrees, since that is what most people are
  244. used to.
  245.  
  246.     Expressions are allowed, i.e. 3*360 is a perfectly valid way of
  247. saying three turns of a circle.
  248.  
  249.     Numbers are as far as I can remember always separated from each
  250. other by a comma or keyword unless they are in an expression as above.
  251.  
  252.     If you have to enter three numbers together you will almost
  253. certainly need to enclose them in "<" and ">".
  254.  
  255. STACK TRANSFORMS
  256.  
  257.     Once you have stacked or joined some objects you can apply some
  258. transformations to them, for example you can "compress" them slightly
  259. e.g.
  260.  
  261.         sphere stack 10 in 7;
  262.         end;
  263.  
  264.     This will fit 10 spheres into the space that would have been
  265. occupied by 7. Another way is
  266.  
  267.         sphere stack 10 in 50%;
  268.         end;
  269.  
  270. This stacked them into 50% of their original space.
  271.  
  272.  
  273. you can bend them
  274.     
  275. BEND
  276.         sphere stack 10 bend 90;
  277.  
  278. This bent them so that the last one is bent 90 degrees out of position. 
  279.  
  280. and 
  281. TWIST
  282.         box stack 10 twist 45
  283.  
  284. This twists them around their own axis, similar yet different to bend. 
  285.  
  286. OFFSET TWIST
  287. A variation on twist is:
  288.  
  289.         sphere stack 40 twist 360 , 1;
  290.  
  291. in this case the boxes are twisted but not around their own axes, the
  292. second number is the amount of offset.
  293.  
  294. TWISTX and TWISTZ
  295.     These are two more variations on TWIST, can be nice when combined
  296. with BEND try
  297.         torus stack 20 in 25% twistz -90 bend 180; (see flip.frm)
  298.  
  299. GROW
  300.         sphere stack 10 grow 0.1;
  301.  
  302. This "grows" the stack leaving the first item alone, and
  303. progressivly "growing" each item until the last is "grown" by the
  304. specified amount.
  305.  
  306. other types of grow are:
  307. powered_grow
  308. centered_grow
  309. powered_centered_grow
  310.  
  311. There is very little difference between these types, but you might
  312. like to play with them later. (I might like to improve the syntax as well)
  313.  
  314. COMBINATIONS
  315.  
  316. Twist, bend, grow can be combined in ANY order as in 
  317.  
  318.     sphere stack 40 in 75% twist 45 bend 60 grow 1.3;
  319.  
  320. NOTE the semi colon at the end , this means that the object is
  321. finished, most commands in FORM finish with a semicolon.
  322.  
  323. NOTE ALSO if we had entered
  324.  
  325.     sphere stack 40 in 75% bend 60 twist 45 grow 1.3;
  326.  
  327. We would have got a different form.
  328.  
  329. CHANGING SIZES
  330.  
  331. In FORM there are only five basic objects, the "sphere", the "box",
  332. the "torus", the "ellipse", and the spacer. All of these have a basic
  333. size and shape. But you are not limited to these defaults, you can
  334. set your own values for radii/proportions.
  335.  
  336. For example the word "sphere" creates a sphere with a "radius" of
  337. half a unit, the phrase "sphere 1.5", creates a sphere three times as
  338. large. This means we can vary the appearance of a sphere so:
  339.  
  340.     sphere , sphere 0.8 stack 10;
  341.  
  342. Will give a stack of alternating large and small spheres.
  343.  
  344. BOX
  345.     for boxes you can again vary the size as in
  346.  
  347.     box 1.5; 
  348.  
  349. but you can also turn the box into a brick by specifying three
  350. lengths for it as in: 
  351.  
  352.         box <0.5 , 1.5 , 0.2>;
  353.  
  354. which gives a box 1 unit across 3 units high and 0.4 units deep. 
  355.  
  356. NOTE the "<" and ">", these are required.
  357.  
  358. ELLIPSE
  359.  
  360.     The default ellipse is indistinguishable from a sphere, the
  361. reason spheres are included is simply because they display faster.
  362. Ellipses (or ellipsoids as they should be called) can be modified.
  363. You can specify their width and height, or their size along all three
  364. axes to give smartie and rugby ball shapes.
  365.  
  366.     e.g. 
  367.         ellipse;                     a spherical ellipse 
  368.         ellipse 0.5 , 0.1;           an ellipse 0.5 wide, 0.1 high (a smartie)
  369.         ellipse <1.4 , 0.2, 0.34>    an ellipse 1.4 wide, 0.2 high, 0.34 deep.
  370.                                      (rugby ball along x axis)
  371.  
  372.  
  373. TORUS
  374.  
  375.     Toroids, are doughnut shapes, you specify the small radius and
  376. the large radius, defaults are: 0.2 , 0.5. These are quite expensive
  377. computationally, but can give nice hollow stem effects, if you don't
  378. need them to be hollow try ellipse above to achieve a similar effect.
  379.  
  380.     e.g.    torus;
  381.             torus 0.3, 0.6;
  382.  
  383. CONE
  384.     cones are, well cones really. Specify a base radius, and a height.
  385.     e.g.    cone;
  386.             cone 0.3, 0.6;
  387.  
  388. SPACER
  389.     spacers are invisible objects that are there to help you create
  390. gaps, and overlaps. ALL spacers require a size. Think of them as
  391. invisble spheres.
  392.  
  393.     e.g.    spacer;
  394.             spacer 5;
  395.  
  396.  
  397. DEFINING YOUR OWN OBJECTS :  named objects 
  398.  
  399.     Unfortunately you cannot define your own primitives as such, but
  400. you can create NAMED OBJECTS. The way to do this is best shown by an
  401. example:-
  402.  
  403. my_object = sphere stack 10 bend 30;
  404.  
  405.     This defines an object called "my_object", it will not be
  406. displayed, to display it you would need a line like:
  407.  
  408. my_object;
  409.  
  410.     This line actually creates one of my_object for display. Once you
  411. have defined an object you can use it anywhere you like - so you can
  412. now have:
  413.  
  414.     my_object = sphere stack 10 bend 30;
  415.     my_object , box 5;
  416.     end;
  417.  
  418.     Not especially useful, but some of the more fun operations can
  419. only be performed using named objects. Another use for named objects
  420. is to speed up display, if you are using a lot of torus or ellipses,
  421. you might use named objects to speed things up like so:
  422.  
  423.     torus stack 30 bend 20; 
  424.  
  425.     will take x seconds to display on my machine, so I change the
  426. description to read:
  427.  
  428.     basic_object = ellipse 0.7, 0.5;    // min rad+ maj rad = 0.5+ 0.2 = 0.7
  429.     basic_object stack 30 bend 20;
  430.  
  431.     this now displays in y seconds. When I am happy with the form I
  432. can now change the first line to read
  433.  
  434.     basic_object = torus 0.2 , 0.5;
  435.  
  436. and I get my original picture back again.
  437.  
  438. SQUARE BRACKETS
  439.  
  440.     If you include a named object in a list you can optionally turn
  441. it on its side by using "[" object_name "]". This makes the obect
  442. grow out sideways. This is used in SAMPLE1 to get the stair treads.
  443.  
  444. ROUND BRACKETS
  445.     These group operations together like normal brackets, so you can
  446.     now say :
  447.  
  448.     sphere, (box stack 5), torus;
  449.  
  450.     and get
  451.     s b b b b b t
  452.  
  453. FAN
  454. ===
  455.     This is not very well named, it produces a "dandelion head" effect, try
  456.  
  457.     ellipse <0.2 , 0.5, 0.2> fan 40 , 180;
  458.  
  459.     The first value after fan is the number of copies to make, just
  460. like stack.  The second value is the amount of spread to use, 180 is
  461. full spread, 90 gives a hemisphere etc.
  462.  
  463.     There is an optional third value, "tightness", this gives "pulls"
  464. the individual spikes together, try
  465.  
  466.     ellipse <0.2 , 0.5, 0.2> fan 40 , 180 , 0.1;
  467.  
  468. remember you can use named objects wherever you had a simple object,
  469. so you could try:
  470.  
  471.     sos /* stack of spheres */ = sphere stack 10 bend 20 twist 45;
  472.     sos fan 40 , 180 , 0.1;
  473.  
  474. It starts taking longer doesn't it, but it does look quite complex
  475. (it is there are now 800 spheres in that picture).
  476.  
  477. The base in "flagpole.frm" is made from a fan of smartie shaped ellipsoids.
  478.  
  479. WEB
  480. ===
  481.     This on the other hand is well named, it produces a spiders web
  482. effect. It does however work best with previously defined stacks of
  483. objects.
  484.  
  485.     try 
  486.     sos /* stack of spheres */ = sphere stack 10;
  487.     sob /* stack of boxes */ = box stack 10 bend 20 twist 45;
  488.     sos web 3 with sob 4;
  489.     
  490. there are three more optional values, so for a full web you can get
  491.  
  492.     OBJECT web SPOKE_NUMBER with DEFINED_OBJECT scale SCALE_NUMBER
  493.     WEBBING_NUMBER HOLE_NUMBER EXCESS_NUMBER (uppercase words
  494.     supplied by you)
  495.  
  496.  
  497.     so using the above objects "sob" and "sos" we can get
  498.  
  499.     sos web 5 with sob scale(2) 10;
  500.  
  501.     will enlarge the "webbing" to twice its original size.
  502.  
  503.     sos web 5 with sob 10 hole 0.5
  504.  
  505.     will leave a hole about half the length of the spokes in the
  506.     middle. 
  507.  
  508.     sos web 5 with sob 10 excess 0.5
  509.  
  510.     will make the webbing continue on past the end of the spokes for
  511.     a distance of about half the length of the spokes.
  512.  
  513.  
  514.     see web1.frm, web2.frm and webgood.frm for examples of this.
  515.  
  516.  
  517. HEIGHTLESS OBJECTS
  518.  
  519.     When an object has been made with WEB or FAN it has no height,
  520. stacking them together has no effect, you MUST place a spacer in
  521. between them to get them to stack. 
  522.  
  523.     sphere , spacer , box, spacer stack 20;
  524.  
  525.  
  526. Other operations
  527. ================
  528. you can
  529.  
  530. DELETE  x
  531.     this removes the x'th piece from the from.
  532. and 
  533. DELETE x..y
  534.     which removes the x to y'th pieces from the from.
  535.  
  536. useful for getting rid of clutter.
  537.  
  538.  
  539. MOVE < x , y , z>
  540.     Moves the whole objects so far x units along the x axis etc. I'm still
  541. not very happy about this command, but it might be usefull.
  542.  
  543. COPYRIGHT some text here
  544.     You can put a copyright message in your script, it must be the
  545. first non blank item on a line. The whole line is output to the
  546. screen. In future versions this message may also be placed in any
  547. output file capable of accepting it e.g. as a GIF comment.
  548.  
  549. SPACING OBJECTS
  550.  
  551.     This is an invisible object used to get round problems in the
  552.     system. For example we have made a fan 
  553.  
  554.     sos /* stack of spheres */ = sphere stack 10 bend 20 twist 45 , 0.5;
  555.     nicefan = sos fan 10 , 90, 0.1
  556.  
  557. and we want to put 5 on top of each other:
  558.  
  559.     nicefan stack 5;
  560.  
  561. (press <ESC> if you get bored waiting for it to finish)
  562.  
  563. that didn't work because fans have no or very little height, we need
  564. to space them a bit.   
  565.  
  566. so try
  567.     
  568.     sos /* stack of spheres */ = sphere stack 10 bend 20 twist 45 , 0.5;
  569.     nicefan = sos fan 10 , 90, 0.1
  570.     spaced_fan = nicefan , spacer 5; 
  571.     // spacer is radius 5 because if we look closely at sos we can  
  572.     // guess it's about 5 units tall (10 * 0.5)
  573.     // alternatively we could have had
  574.     // spaced_fan = nicefan , sos delete 2 // which would have been
  575.     // more accurate
  576.  
  577.     spaced_fan stack 5;
  578.  
  579. works fine.
  580.  
  581.  
  582. Negative Spacing Objects
  583.  
  584. This is still part of the same workaround, consider:
  585.     a = sphere stack 10 in 10%;
  586.     b = sphere stack 10 in 10%;
  587.  
  588. then the join in "a,b" should be virtually indistingushable, 
  589. unfortunately it isn't, there's no overlap!
  590.  
  591. so we introduce a negative spacer 
  592.  
  593.     a,spacer -0.4,b; 
  594.  
  595. this then looks OKish. I'll be fixing this problem in a later release.
  596.  
  597.  
  598. POV
  599. ===
  600.     FORM definitely supports POV version 2.0, it may support POV
  601. version 1.0 but then again I'm afraid it might not. Get POV2 if you
  602. haven't already. 
  603.  
  604.     To output for POV use the command line option -pov+, you'll
  605. probably want to turn off the display as well (display-). This will
  606. produce a file called "temp.pov". This file declares a union called
  607. TheFormObject which is scaled to approximately unit size. This file
  608. is included by "FORMVUE2.POV" which will give a fairly acceptable
  609. view of the FORM. You will need to texture your form.
  610.  
  611. Textures (POV and VIVID users only)
  612. ========
  613.  
  614.     FORM does not support textures as such, but it does allow some 
  615. level of textures for POV usage. To apply a texture simply put the keyword
  616. texture and the texture name after the object.
  617. e.g.
  618.  
  619.         sphere texture Red;
  620.  
  621. textures apply (in POV) to all uncoloured objects, so :
  622.  
  623.         a_piece = sphere , sphere texture red, box stack 20 texture blue;
  624.                 
  625.         will colour half of the spheres and all the boxes "blue", 
  626. and the remaining spheres will be coloured "red".
  627.  
  628. Note the above could have been written
  629.  
  630.         a_piece = sphere, sphere texture red, box stack 20;
  631.         a_piece texture blue;
  632.  
  633. Also note once textured an object cannot be "repainted".
  634.  
  635. If the texture you want is not already a predefined one you can 
  636. "roll your own" by enclosing it in quotes. For example we could have said:
  637.  
  638.         a_piece texture "Metal pigment{White}";
  639.  
  640.  
  641. You can look at the files FLAGPOLE.FRM and WEBGOOD.FRM if you want to
  642. see textures in use. Before you go out and start raytracing these be
  643. warned WEBGOOD.FRM took 4 solid days to trace on a 486DX30 at 640x480
  644. with anti aliasing on!
  645.  
  646.  
  647. Changing the shapes in POV
  648. ======== === ====== == ===
  649.  
  650.  
  651. If you want to change the shapes in POV use the command line switch
  652. pov_declare_all_prims. This outputs each primitive used as a declare
  653. at the top of the file in the order in which they are found in your
  654. script. You can then edit the temp.pov output to change the
  655. declarations, and insert your own shape. e.g. 
  656. #declare Sphere_2 = union { object { Cube scale .5 } object { Cone_Y }}
  657.  
  658.  
  659. Authors Note
  660. ============
  661. Texturing is still in it's infancy (introduced at the start of NOV 93), I 
  662. still have to fix it so that textures can be applied between transforms. 
  663. It can be done in the current version but it doesn't work properly.
  664.  
  665.  
  666. Other command line features are described in another document, look for it  
  667. as some of the features can be useful. 
  668.  
  669.  
  670.         rummy@snaffle.demon.co.uk
  671.  
  672.         Andrew Rowbottom
  673.  
  674.  
  675.  
  676.  
  677. COPYRIGHTS & TRADEMARKS
  678.  
  679.     All trademarks mentioned in the documentation belong to their
  680.     respective owners.
  681.